import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class demo4 {
    public static void main(String[] args) {
        // 准备原始数据（包含重复元素、不同大小的整数）
        List<Integer> originalList = Arrays.asList(1, 2, 2, 3, 4, 5, 6, 6, 7, 8, 9);
        System.out.println("原始集合: " + originalList);

        // ====================== 1. filter 测试 ======================
        System.out.println("\n--- 1. filter (过滤出大于3的元素) ---");
        originalList.stream()
                .filter(num -> num > 3)
                .forEach(System.out::print);

        // ====================== 2. limit 测试 ======================
        System.out.println("\n--- 2. limit (获取前3个元素) ---");
        originalList.stream()
                .limit(3)
                .forEach(System.out::print);

        // ====================== 3. skip 测试 ======================
        System.out.println("\n--- 3. skip (跳过前3个元素) ---");
        originalList.stream()
                .skip(3)
                .forEach(System.out::print);

        // ====================== 4. distinct 测试 ======================
        System.out.println("\n--- 4. distinct (元素去重) ---");
        originalList.stream()
                .distinct()
                .forEach(System.out::print);

        // ====================== 5. concat 测试 ======================
        System.out.println("\n--- 5. concat (合并两个流) ---");
        Stream<Integer> streamA = Stream.of(10, 11);
        Stream<Integer> streamB = Stream.of(12, 13);
        Stream.concat(streamA, streamB)
                .forEach(System.out::print);

        // ====================== 6. map 测试 ======================
        System.out.println("\n--- 6. map (转换元素类型：Integer -> String，添加前缀) ---");
        originalList.stream()
                .map(num -> "数字：" + num)
                .forEach(System.out::println);


        // ====================== 7. sorted 测试 ======================
        System.out.println("\n--- 7. sorted把顺序改为从大到小 ---");
        originalList.stream()
                .sorted((a,b)->b-a)
                .forEach(System.out::print);

        // ====================== 8. peek 测试 ======================
        System.out.println("\n--- 7. peek ---");
        List<Integer> result = originalList.stream()
                .filter(n -> n % 2 == 0)       // 筛选偶数
                .peek(n -> System.out.println("过滤后的元素：" + n))  // 窥视中间结果
                .map(n -> n * 2)               // 乘以2
                .peek(n -> System.out.println("乘以2后的元素：" + n)) // 再次窥视
                .collect(Collectors.toList()); // 终端操作（触发执行）

        System.out.println("最终结果：" + result);

        // ====================== 链式编程演示（多个中间操作组合） ======================
        System.out.println("\n--- 链式编程：filter(偶数) -> distinct -> limit(2) -> map(加后缀) ---");
        originalList.stream()
                .filter(num -> num % 2 == 0)   // 过滤偶数
                .distinct()                    // 去重
                .limit(2)                      // 取前2个
                .map(num -> num + "-偶数")      // 转换为带后缀的字符串
                .forEach(System.out::println);

        // ====================== 验证“不影响原集合” ======================
        System.out.println("\n--- 验证：修改Stream数据不会影响原集合 ---");
        System.out.println("原集合（修改前）: " + originalList);
        // 在Stream中修改元素（乘以10）
        originalList.stream()
                .map(num -> num * 10)
                .forEach(modifiedNum -> System.out.println("Stream中修改后：" + modifiedNum));
        System.out.println("原集合（修改后）: " + originalList); // 原集合无变化
    }
}
